#ifndef _ADC_H
#define _ADC_H

#include "sn_config.h"

#define ADC_MAX_NUM  5
#define  ADC_FILTER_MAX   50              
#define ADC_MAX_DIS 4096 //最大显示值
struct vol_fator_t
{
    uint16_t in_setting;//输入设定值
    uint16_t in_sample;//输入采样值
    uint16_t max_dis_value;//最高显示电压 
};


struct adc_dev_t 
{
    uint8_t              num; //adc number
    uint8_t             comple_flag;// 转换完成标志
    uint16_t            fact_vol[ADC_MAX_NUM];//实际值
    float               show_vol[ADC_MAX_NUM];//转换值
    struct vol_fator_t factor[ADC_MAX_NUM];//参数
    /**
     * @brief 读取底层adc值，这个函数是整个adc面向hal层的函数
     * 
     */
    uint16_t (*read_hal_adc)(uint8_t num);   
    /**
     * @brief 手动更新adc,在主函数中调用，ADC工作在顺序模式时使用
     * 
     */
    int (*convert_update)(void);
    /**
     * @brief 转换完成 转换完成函数 1 转换完成 0 未转换完成
     * 
     */
    uint8_t (*convert_to_complete)(struct adc_dev_t *dev);
    /**
     * @brief adc 转换函数
     * 
     */
    int (*convert_func)(struct adc_dev_t *dev);
 
    /**
     * @brief 获取实际adc值
     * 
     */
    uint16_t (*get_voltage)(struct adc_dev_t *dev,uint8_t num);
    /**
     * @brief 获取比例后的adc值
     * 
     */
    float (*get_factor_voltage)(struct adc_dev_t *dev,uint8_t num);
    /**
     * @brief 滤波函数
     * 
     */
    int (*filter)(struct adc_dev_t *dev);
    /**
     * @brief 设置放大倍数
     * 
     */
    int(*set_factor)(struct adc_dev_t *dev,uint8_t num,struct vol_fator_t *param);
    /**
     * @brief 获取放大倍数
     * 
     */
    int(*get_factor)(struct adc_dev_t *dev,uint8_t num,struct vol_fator_t **param);

};

int adc_init(struct adc_dev_t **dev);
#endif // !_ADC_H
